package br.com.generico.negocios.controlador.imp;

import java.io.Serializable;
import java.util.Collection;

import br.com.generico.negocios.controlador.IControlador;
import br.com.generico.negocios.entidade.IEntidade;
import br.com.generico.repositorio.DAO.IGenericDAO;
import br.com.generico.repositorio.filtro.IFiltro;

public abstract class ControladorGenerico<ENTIDADE extends IEntidade, ID extends Serializable, FILTRO extends IFiltro, REPOSITORIO extends IGenericDAO<ENTIDADE, ID, FILTRO>>
		implements IControlador<ENTIDADE, ID, FILTRO, REPOSITORIO> {

	private final REPOSITORIO repositorioDAO;

	public ControladorGenerico(REPOSITORIO repositorioDAO) {
		this.repositorioDAO = repositorioDAO;
	}

	public void alterar(ENTIDADE vo) {
		this.validarAlteracao(vo);
		this.validarUnicidade(vo);
		this.repositorioDAO.alterar(vo);
	}

	public ENTIDADE buscar(ID id) {
		return this.repositorioDAO.buscar(id);
	}

	public Collection<ENTIDADE> consultar(FILTRO filtro) {
		return this.repositorioDAO.consultar(filtro);
	}

	public REPOSITORIO getRepositorioDAO() {
		return this.repositorioDAO;
	}

	public void inserir(ENTIDADE vo) {
		this.validarInclusao(vo);
		this.validarUnicidade(vo);
		this.repositorioDAO.inserir(vo);
	}

	public void remover(ENTIDADE vo) {
		this.repositorioDAO.remover(vo);
	}

	public abstract void validarAlteracao(ENTIDADE vo);

	public abstract void validarExclusao(ENTIDADE vo);

	public abstract void validarInclusao(ENTIDADE vo);

	public abstract void validarUnicidade(ENTIDADE vo);

}
